home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
oper_sys
/
oasis
/
oasis1-1.lha
/
oasis-1.1
/
print.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-01
|
27KB
|
811 lines
/*==========================================================================*
Oasis Alpha Version 1.1 (C) Copyright 1992 Fah-Chun Cheong
Revised: 5/1/92 by: fcc@eecs.umich.edu and The University of Michigan
------------------------------------------------------------------------
Permission to use, copy, modify, distribute, sell and resell Oasis Alpha
software and its documentation for any purpose and without fee is hereby
granted, provided that the authorship be appropriately credited and
acknowledged, and that the above copyright notice appear in all copies
and both the copyright notice and this permission notice appear in
supporting documentation. The author makes no representations about the
suitability of this software for any purpose. It is provided "as is"
without express or implied warranty. Oasis Alpha is free, caveat emptor!
------------------------------------------------------------------------
To request Oasis Alpha source code: oasis-alpha-request@eecs.umich.edu
To enroll in the mailing list: oasis-alpha-request@eecs.umich.edu
To send bug reports: oasis-alpha-bugs@eecs.umich.edu
To discuss openly all matters Oasis: oasis-alpha@eecs.umich.edu
*==========================================================================*/
#include "parser.h"
#include "par.h"
#define print0(s) ptr += strlen((sprintf(ptr, s), ptr))
#define print1(s,a) ptr += strlen((sprintf(ptr, s, a), ptr))
#define print2(s,a,b) ptr += strlen((sprintf(ptr, s, a, b), ptr))
static char *ptr;
int len_props(props)
Prop *props;
{
int i = 0;
for (; props; props = props->next) i++;
return i;
}
int len_pars(pars, flow)
Par *pars;
int flow;
{
int i = 0;
for (; pars; pars = pars->next)
if (pars->flow == flow) i++;
return i;
}
Par *next_pars(pars, flow)
Par *pars;
int flow;
{
for (; pars; pars = pars->next)
if (pars->flow == flow) break;
return pars;
}
int match_pars(pars1, pars2)
Par *pars1;
Par *pars2;
{
if (len_pars(pars1, IN) != len_pars(pars2, IN))
return FALSE;
pars1 = next_pars(pars1, OUT);
pars2 = next_pars(pars2, OUT);
while (pars1 && pars2) {
if (pars1->node->tag != VAR ||
pars2->node->tag != LVAR ||
Voff(pars1->node) != Voff(pars2->node))
return FALSE;
pars1 = next_pars(pars1->next, OUT);
pars2 = next_pars(pars2->next, OUT);
}
return (pars1 || pars2) ? FALSE : TRUE;
}
int max_vars(rules, moff)
Rule *rules;
int moff;
{
int max = 1;
while (rules && rules->head->moff == moff) {
Par *pars = rules->head->pars;
Var *vars = rules->vars;
int k = 0;
int s = 1;
for (; pars; pars = pars->next)
if (pars->node->tag == LVAR) {
if (!islast(rules, moff))
((Var *) pars->node->this.p)->use = LAST;
Voff(pars->node) = ++k;
pars->node = Anon;
}
else if (pars->flow == IN) {
Type *type = pars->node->type;
vars = Var_("_", ++k, BB, HEAD, HEAD, type, type, type, vars);
if (!islast(rules, moff))
vars->use = LAST;
}
for (; vars; vars = vars->next)
if (vars->voff == 0)
vars->voff = -++s;
max = s > max ? s : max;
rules = rules->next;
}
return max - 1;
}
int in_node(node)
Node *node;
{
if (node) switch (node->tag) {
case ARRAY:
case HANDLE:
case AT:
case OBJECT:
case STRING: return TRUE;
case LIST: if (node->this.p)
return TRUE;
}
return FALSE;
}
int in_pars(pars, flow)
Par *pars;
int flow;
{
for (; pars; pars = pars->next)
if (pars->flow == flow &&
in_node(pars->node))
return TRUE;
return FALSE;
}
int in_preds(preds)
Pred *preds;
{
for (; preds; preds = preds->next)
switch (preds->tag) {
case SEND: if (in_node(preds->dest)) return TRUE;
case INVK:
case CALL:
case WAIT:
case POST: if (in_pars(preds->pars, IN)) return TRUE; break;
case RELOP: if (in_node(preds->pars)) return TRUE; break;
}
return FALSE;
}
int in_clus(clus)
Clu *clus;
{
for (; clus; clus = clus->next)
if (in_preds(clus->pred))
return TRUE;
return FALSE;
}
int in_rules(rules, moff)
Rule *rules;
int moff;
{
while (rules && rules->head->moff == moff) {
if (in_clus (rules->body) ||
in_clus (rules->tail) ||
in_preds(rules->last))
return TRUE;
rules = rules->next;
}
return FALSE;
}
void print_node(vars, node)
Var *vars;
Node *node;
{
if (node) switch (node->tag) {
case AS: print_node(vars, node->this.p);
print_node(vars, node->that); break;
case LIST: if (node->this.p) {
print1("%d", len_props(node->this.p));
print_tag (get_elem(node->type));
}
case LLIST: print0("[");
print_props(vars, node->this.p);
if (node->that) {
print0("|");
print_node(vars, node->that);
}
print0("]"); break;
case ARRAY: print_node(vars, node->this.p);
if (node->that) {
print0("{");
print_node(vars, node->that);
print0("}");
} break;
case DOPE: print1("%d:", len_props(node->that));
print1("%d", node->this.i);
print_tag (get_item(node->type));
case LDOPE: print0("$[");
print_props(vars, node->that);
print0("]"); break;
case ITEM: print_node(vars, node->this.p);
if (node->that) {
print0(",");
print_node(vars, node->that);
} break;
case AT: print_node(vars, node->this.p);
print_node(vars, node->that); break;
case HANDLE:print1("%s:", node->type->u.class->name);
print1("%d", node->this.i);
print_node(vars, node->that); break;
case AGENT:
case OBJECT:print1("%s:", node->type->u.class->name);
print1("%d", node->this.i);
if (node->type->u.class->cons) {
print0("[");
print_tags (node->type->u.class->cons);
print0("]");
}
print0("{");
print_props(vars, node->that);
print0("}"); break;
case SITE: print1("@%s", node->this.p);
print1(":%d", node->that); break;
case COND: print1("~%d", node->this.i); break;
case LVAR: print0("?");
case VAR: print1("#%d", Voff(node));
print_node(vars, node->that);
print_tag (node->type); break;
case LREF: print0("?");
case REF: print1("`%d", node->this.i);
print_node(vars, node->that);
print_tag (node->type); break;
case FIELD: print1(".`%d", node->this.p);
print_node(vars, node->that); break;
case INDEX: print0("[");
print_props(vars, node->this.p);
print0("]");
print_node(vars, node->that); break;
case EXPR: print0("(");
print_node(vars, node->this.p);
print0(")");
print_tag (node->type); break;
case FUN: print1("%s(", node->this.p);
print_node(vars, node->that);
print0(")"); break;
case ADD:
case SUB:
case MUL:
case DIV:
case REM: print0("(");
print_node(vars, node->this.p);
print1("%c", node->tag);
print_tag (node->type);
print_node(vars, node->that);
print0(")"); break;
case RADD:
case RMUL: print0("(");
print_node(vars, node->that);
print1("%c", -node->tag);
print_tag (node->type);
print_node(vars, node->this.p);
print0(")"); break;
case RSUB:
case RDIV:
case RREM: print0("(");
print_node(vars, node->that);
print1("%c'", -node->tag);
print_tag (node->type);
print_node(vars, node->this.p);
print0(")"); break;
case INT: print1("%d", node->this.i); break;
case REAL: print1("%f", node->this.f); break;
case CHAR: print1("'%s'", node->this.p); break;
case STRING:print1("\"%s\"", node->this.p); break;
case ANON: print0("_"); break;
case NIL: print0("$nil"); break;
case SELF: print0("#0");
print_tag (node->type); break;
}
}
void print_tag(type)
Type *type;
{
switch (type->tag) {
case CHAR: print0(":c"); break;
case INT: print0(":i"); break;
case REAL: print0(":f"); break;
case OBJECT:print0(":o"); break;
case AGENT: print0(":a"); break;
case ARRAY: print0(":y"); break;
case LIST: print0(":l"); break;
case META: print1(":$%d", type->u.meta); break;
}
}
void print_tags(cons)
Con *cons;
{
while (cons) {
print_tag(cons->type);
cons = cons->next;
print0(cons ? "," : "");
}
}
void print_type(type)
Type *type;
{
switch (type->tag) {
case CHAR: print0("c:"); break;
case INT: print0("i:"); break;
case REAL: print0("f:"); break;
case OBJECT:print1("o:%s ", type->u.class->name);
print0("[");
print_types(type->u.class->cons);
print0("]"); break;
case AGENT: print1("a:%s ", type->u.class->name);
print0("[]"); break;
case ARRAY: print0("y:");
print_type (type->u.array->item);
print0("[");
print_dims (type->u.array->dims);
print0("]"); break;
case LIST: print0("l:");
print_type (type->u.list); break;
}
}
void print_types(cons)
Con *cons;
{
while (cons) {
print_type(cons->type);
cons = cons->next;
print0(cons ? "," : "");
}
}
void print_dims(dims)
Dim *dims;
{
while (dims) {
print1("%d", dims->size);
dims = dims->next;
print0(dims ? "," : "");
}
}
void print_props(vars, props)
Var *vars;
Prop *props;
{
while (props) {
print_node(vars, props->node);
props = props->next;
print0(props ? "," : "");
}
}
int print_rpars(vars, pars, flow)
Var *vars;
Par *pars;
int flow;
{
for (; pars; pars = pars->next)
if (pars->flow == flow) {
if (print_rpars(vars, pars->next, flow))
print0(", ");
print_node(vars, pars->node);
return TRUE;
}
return FALSE;
}
void print_pars(vars, pars, flow)
Var *vars;
Par *pars;
int flow;
{
for (; pars; pars = pars->next)
if (pars->flow == flow) {
print_node(vars, pars->node);
pars = pars->next; break;
}
for (; pars; pars = pars->next)
if (pars->flow == flow) {
print0(", ");
print_node(vars, pars->node);
}
}
int print_rargs(pars, flow)
Par *pars;
int flow;
{
for (; pars; pars = pars->next)
if (pars->flow == flow) {
if (print_rargs(pars->next, flow))
print0(", ");
print_tag(pars->node->type);
return TRUE;
}
return FALSE;
}
void print_vars(vars, step)
Var *vars;
int step;
{
Var *vs;
for (vs = vars; vs; vs = vs->next)
if (ispointer(vs->mint) && islive(vs, step)) {
print1("#%d", vs->voff);
print_tag (vs->mint);
vs = vs->next; break;
}
for (; vs; vs = vs->next)
if (ispointer(vs->mint) && islive(vs, step)) {
print1(",#%d", vs->voff);
print_tag (vs->mint);
}
print0(";");
for (vs = vars; vs; vs = vs->next)
if (ismeta(vs->mint) && islive(vs, step)) {
print1("#%d", vs->voff);
print_tag (vs->mint);
vs = vs->next; break;
}
for (; vs; vs = vs->next)
if (ismeta(vs->mint) && islive(vs, step)) {
print1(",#%d", vs->voff);
print_tag (vs->mint);
}
}
void print_last(vars, last)
Var *vars;
Pred *last;
{
print1("&%d", last->moff);
print0("(");
print_rpars(vars, last->pars, IN);
print0(")");
if (last->dest)
print1(" ::%s", last->dest);
}
int print_preds(vars, step, preds, last)
Var *vars;
int step;
Pred *preds;
Pred *last;
{
if (preds != last) switch (preds->tag) {
case FALSE: print0("$fail");
return FALSE;
case TRUE: print0("$true");
return TRUE;
case RELOP: print_node(vars, preds->pars);
switch (preds->moff) {
case IS: print0(" = "); break;
case EQ: print0(" == "); break;
case NE: print0(" <> "); break;
case LT: print0(" > "); break;
case LE: print0(" >= "); break;
case GT: print0(" < "); break;
case GE: print0(" <= "); break;
}
print_node(vars, preds->dest);
return TRUE;
case WAIT: print0("$wait");
print0("(");
print_rpars(vars, preds->pars, IN);
print0(")!");
print_node(vars, preds->dest);
print0("[");
print_vars(vars, step);
print0("] ");
return TRUE;
case POST: print0("$post");
print0("(");
print_rpars(vars, preds->pars, IN);
print0(")!");
print_node(vars, preds->dest);
return TRUE;
case SEND: print1("&%d", preds->moff);
print0("[");
print_rargs(preds->pars, IN);
print0("]");
print0("(");
print_rpars(vars, preds->pars, IN);
print0(")");
print0("[");
print_rargs(preds->pars, OUT);
print0("]");
print0(" ! ");
print_node(vars, preds->dest);
if (preds->next) {
print0(",\n\t");
print_preds(vars, step, preds->next, last);
}
print1(" :%d", len_pars(preds->pars, OUT));
print0("(");
print_pars(vars, preds->pars, OUT);
print0(")");
return TRUE;
default: print1("&%d", preds->moff);
print1(":%d", len_pars(preds->pars, IN));
print1(":%d", len_pars(preds->pars, OUT));
print0("(");
print_rpars(vars, preds->pars, IN);
print0(")");
switch (preds->tag) {
case INVK: print0(" ! ");
print_node(vars, preds->dest);
break;
case CALL: if (preds->dest)
print1(" ::%s", preds->dest);
}
print0("[");
print_vars(vars, step);
print0("] ");
print0("(");
print_pars(vars, preds->pars, OUT);
print0(")");
}
return TRUE;
}
int print_clus(vars, step, clus, last)
Var *vars;
int step;
Clu *clus;
Pred *last;
{
while (clus) {
Pred *preds = clus->pred;
print0("\t");
if (!print_preds(vars, step, preds, last))
return HEAD;
step += NEXT;
clus = clus->next;
print0(clus && clus->pred != last ? ";\n" : "");
}
return step;
}
void print_rules(rules, kind)
Rule *rules;
int kind;
{
int moff = -1;
for (; rules; rules = rules->next) {
Var *vars = rules->vars;
Head *head = rules->head;
Clu *body = rules->body;
Clu *tail = rules->tail;
Pred *last = rules->last;
int step = HEAD;
if (moff != head->moff) {
print1("&%d:", moff = head->moff);
print1("%d:", len_pars(head->pars, IN));
print1("%d:", len_pars(head->pars, OUT));
print1("%d", max_vars(rules, moff));
if (in_rules(rules, moff)) {
print0(" [");
print_vars(vars, step);
print0("]");
}
}
if (last && (!tail && !islast(rules, moff)
|| !match_pars(head->pars, last->pars)))
last = NUL;
print0(islast(rules, moff) ? ";\n " : "\n ");
print0("(");
print_pars(vars, head->pars, IN);
print0(")");
step = BODY;
if (body && body->pred != last) {
print0(" :-\n");
step = print_clus(vars, step, body, last);
}
if (tail && tail->pred != last && step != HEAD) {
print0(" |-\n");
step = print_clus(vars, step, tail, last);
}
print0("\n\t=> ");
if (!last && step != HEAD) {
if (in_pars(head->pars, OUT)) {
print0("[");
print_vars(vars, step);
print0("] ");
}
print0("(");
print_rpars(vars, head->pars, OUT);
print0(")");
if (kind == AGENT && head->prot == PUBLIC)
print0("*");
}
else if (last) print_last(vars, last);
print0(islast(rules, moff) ? ".\n" : ";");
}
}
void print_atts(atts)
Att *atts;
{
Att *as;
for (as = atts; as;)
if (isword(as->type)) {
print1("`%d", as->aoff);
print_tag (as->type);
do as = as->next;
while (as && !isword(as->type));
print0(as ? "," : "");
}
else as = as->next;
print0(";");
for (as = atts; as;)
if (ispointer(as->type)) {
print1("`%d", as->aoff);
print_tag (as->type);
do as = as->next;
while (as && !ispointer(as->type));
print0(as ? "," : "");
}
else as = as->next;
print0(";");
for (as = atts; as;)
if (ismeta(as->type)) {
print1("`%d", as->aoff);
print_tag (as->type);
do as = as->next;
while (as && !ismeta(as->type));
print0(as ? "," : "");
}
else as = as->next;
}
void print_goal(goal)
Goal *goal;
{
Var *vars = goal->vars;
int s = 1;
for (; vars; vars = vars->next) {
vars->use = LAST;
vars->voff = -++s;
}
print1("?- %d ", s - 1);
print_clus(goal->vars, BODY, goal->body, NUL);
print0(".\n");
}
void print_spec(spec)
Spec *spec;
{
Gene *genes = spec->genes;
spec->mark = TRUE;
if (spec->base)
print1("%s :: ", spec->base->name);
print1("%s:", spec->name);
print1("%d:", spec->size);
print1("%d", Moff(spec->mets));
if (genes) print0(" <");
while (genes) {
print1("`%d", genes->goff);
genes = genes->next;
print0(genes ? "," : ">");
}
print0("\n{");
print_atts(spec->atts);
print0("}\n");
}
void print_specs()
{
Spec *prev;
Spec *next;
for (prev = NUL; specs;) {
next = specs->next;
specs->next = prev;
prev = specs;
specs = next;
}
for (specs = prev; specs; specs = specs->next)
if (!specs->mark && !specs->mets) {
print_spec(specs);
print0("{}\n");
}
}
void print_imps()
{
Imp *prev;
Imp *next;
for (prev = NUL; imps;) {
next = imps->next;
imps->next = prev;
prev = imps;
imps = next;
}
for (imps = prev; imps; imps = imps->next) {
int kind = isupper(*imps->name) ? AGENT : OBJECT;
print_spec(imps->spec);
print0("{\n");
if (imps->goal)
print_goal(imps->goal);
print_rules(imps->rules, kind);
print0("}\n");
}
}
void print_classes(buf)
char *buf;
{
ptr = buf;
print_imps();
print_specs();
}
char *print_globals(buf)
char *buf;
{
Att *atts = goal->atts;
Att *prev;
Att *next;
ptr = buf;
prev = NUL;
while (atts != Atts0) {
next = atts->next;
atts->next = prev;
prev = atts;
atts = next;
}
atts = prev;
while (atts) {
print1("%s ", atts->name);
print_type (atts->type);
print0("\n");
atts = atts->next;
}
*ptr++ = '\0';
return ptr;
}
char *print_locals(buf)
char *buf;
{
Var *vars = goal->vars;
Var *prev;
Var *next;
int vno = 0;
ptr = buf;
for (prev = NUL; vars; vno++) {
next = vars->next;
vars->next = prev;
prev = vars;
vars = next;
}
print1("%d\n", vno);
vars = prev;
prev = NUL;
while (vars) {
print1("%s ", vars->name);
print_tag (vars->mint);
print0("\n");
next = vars->next;
vars->next = prev;
prev = vars;
vars = next;
}
return ++ptr;
}
void print_main(buf)
char *buf;
{
ptr = buf;
print_goal(goal);
}